// hotel-management-frontend/src/admin/BulkImport.js
import React, { useState } from 'react';
import { Upload, Button, Table, message } from 'antd';
import { UploadOutlined } from '@ant-design/icons';
import * as XLSX from 'xlsx'; // 导入 xlsx 库
import { adminAPI } from '../services/api'; // 假设你的API调用在这里

const BulkImport = () => {
    const [fileList, setFileList] = useState([]);
    const [previewData, setPreviewData] = useState([]);
    const [loading, setLoading] = useState(false);

    const handleFileUpload = (file) => {
        setLoading(true); // 开始读取文件时设置加载状态
        const reader = new FileReader();

        // 使用 readAsArrayBuffer 来读取 Excel 文件
        reader.onload = (e) => {
            try {
                const data = new Uint8Array(e.target.result);
                const workbook = XLSX.read(data, { type: 'array' }); // 解析工作簿

                // 假设你只需要第一个工作表
                const sheetName = workbook.SheetNames[0];
                const worksheet = workbook.Sheets[sheetName];

                // 将工作表数据转换为 JSON 数组
                // header: 1 表示第一行是标题行，raw: false 尝试转换数据类型 (与RoomManagement.js保持一致)
                const json = XLSX.utils.sheet_to_json(worksheet, { header: 1, raw: false }); // !!! 关键修改: raw: false

                if (json.length === 0) {
                    message.error('文件内容为空或格式不正确！');
                    setPreviewData([]);
                    setFileList([]);
                    return;
                }

                const headers = json[0];
                let rows = json.slice(1); // 获取数据行，使用let以便后续过滤

                const requiredHeaders = ['房间号', '房间类型', '床位数', '价格'];
                const trimmedHeaders = headers.map(h => typeof h === 'string' ? h.trim() : h);

                const isHeaderValid = requiredHeaders.every((val, index) => trimmedHeaders[index] === val);

                if (!isHeaderValid || headers.length !== requiredHeaders.length) {
                    message.error('Excel 文件标题行不符合要求！请确保是 "房间号, 房间类型, 床位数, 价格"。');
                    setPreviewData([]);
                    setFileList([]);
                    return;
                }

                // !!! 新增的关键过滤步骤和类型转换处理 (与RoomManagement.js同步) !!!
                rows = rows.filter(row => {
                    // 过滤掉room_number为空或无效的行
                    // 确保 row[0] 存在且不是 null/undefined，并且转换为字符串后去除空白不是空字符串
                    return row[0] !== undefined && row[0] !== null && String(row[0]).trim() !== '';
                });

                if (rows.length === 0) {
                    message.error('文件中没有有效的房间数据可供导入！');
                    setPreviewData([]);
                    setFileList([]);
                    return;
                }

                const formattedPreview = rows.map((row, index) => {
                    // 确保每一行有足够的列，并处理可能的undefined
                    // 进行显式类型转换和去除字符串空白
                    return {
                        key: `preview-${index}`, // Ant Design Table 需要 key
                        room_number: String(row[0] || '').trim(), // 确保是字符串并去除空白，处理undefined/null情况
                        room_type: String(row[1] || '').trim(),
                        beds: parseInt(row[2], 10) || 0, // 确保是整数，处理非数字或undefined情况
                        price: parseFloat(row[3]) || 0.00, // 确保是浮点数，处理非数字或undefined情况
                    };
                });

                // 进一步验证解析后的数据是否符合基本要求
                const invalidData = formattedPreview.filter(item => (
                    !item.room_number || // 房间号为空
                    !item.room_type || // 房间类型为空
                    isNaN(item.beds) || item.beds <= 0 || // 床位数无效
                    isNaN(item.price) || item.price < 0 // 价格无效
                ));

                if (invalidData.length > 0) {
                    message.warn(`部分导入数据格式不正确（共 ${invalidData.length} 条），请检查预览数据！`);
                    // 这里你可以选择不阻止导入，而是只导入有效数据，或者根据需求进行提示
                }
                // !!! 过滤和转换结束 !!!

                setPreviewData(formattedPreview);
                setFileList([file]); // 设置文件列表，只保留当前上传的文件
                message.success(`${file.name} 文件读取成功，请预览并点击“开始导入”！`);
            } catch (error) {
                console.error('解析Excel文件失败:', error);
                message.error('文件解析失败，请检查文件格式。');
                setPreviewData([]);
                setFileList([]);
            } finally {
                setLoading(false); // 文件读取完毕后取消加载状态
            }
        };

        reader.onerror = () => {
            message.error('文件读取失败！');
            setLoading(false);
        };

        reader.readAsArrayBuffer(file); // 关键：使用 readAsArrayBuffer
        return false; // 阻止 Ant Design 自动上传
    };

    const handleStartImport = async () => {
        if (previewData.length === 0) {
            message.warn('没有数据可以导入！请先选择并解析Excel文件。');
            return;
        }

        setLoading(true);
        try {
            // 这里传递给后端的数据已经是经过过滤和类型转换的了
            const importData = previewData.map(item => ({
                room_number: item.room_number,
                room_type: item.room_type,
                beds: item.beds,
                price: item.price,
            }));

            const response = await adminAPI.bulkImportRooms(importData); // 调用正确的API
            message.success(response.message || `成功导入 ${response.importedCount || 0} 个房间！`);
            setPreviewData([]);
            setFileList([]);
        } catch (error) {
            console.error('批量导入失败:', error);
            message.error(error.response?.data?.message || error.response?.data?.error || '批量导入失败: AxiosError');
        } finally {
            setLoading(false);
        }
    };

    const columns = [
        { title: '房间号', dataIndex: 'room_number', key: 'room_number' },
        { title: '房间类型', dataIndex: 'room_type', key: 'room_type' },
        { title: '床位数', dataIndex: 'beds', key: 'beds' },
        { title: '价格', dataIndex: 'price', key: 'price', render: price => `¥${parseFloat(price).toFixed(2)}` },
    ];

    return (
        <div style={{ padding: '20px' }}>
            <h1>房间批量导入</h1>

            <div style={{ marginBottom: '20px' }}>
                <p>请上传Excel文件（支持.xlsx, .xls格式）。</p>
                <div style={{ marginTop: 8, color: '#999', fontSize: 12 }}>
                    <p>文件格式要求：</p>
                    <ul>
                        <li>文件格式: Excel (xlsx 或 xls)</li>
                        <li>第一个为标题行: "房间号", "房间类型", "床位数", "价格"</li>
                        <li>示例数据:</li>
                        <Table
                            dataSource={[
                                { key: 'ex1', room_number: 101, room_type: '标准间', beds: 2, price: 300 },
                                { key: 'ex2', room_number: 102, room_type: '大床房', beds: 1, price: 350 },
                            ]}
                            columns={columns} // 使用预览列的定义
                            pagination={false}
                            size="small"
                            style={{ width: '100%', marginBottom: '10px' }}
                        />
                    </ul>
                </div>
            </div>

            <Upload
                accept=".xlsx, .xls"
                beforeUpload={handleFileUpload} // 使用自定义上传处理
                fileList={fileList}
                onRemove={() => { setFileList([]); setPreviewData([]); }}
                maxCount={1} // 只允许上传一个文件
            >
                <Button icon={<UploadOutlined />}>选择Excel文件</Button>
            </Upload>
            <Button
                type="primary"
                onClick={handleStartImport}
                disabled={previewData.length === 0}
                loading={loading}
                style={{ marginLeft: '10px' }}
            >
                开始导入
            </Button>

            {previewData.length > 0 && (
                <h2 style={{ marginTop: '20px' }}>预览数据 (共 {previewData.length} 条)</h2>
            )}
            <Table
                columns={columns}
                dataSource={previewData}
                pagination={{ pageSize: 10 }} // 可以添加分页
                bordered
                style={{ marginTop: '10px' }}
            />
        </div>
    );
};

export default BulkImport;